/*
 * ArticuloAdmin.java
 *
 * Created on 16 de abril de 2007, 10:30
 */

package despachador.administracion;

import excepciones.AvwException;
import gestores.administracion.GestorArticulo;
import java.io.*;
import java.net.*;
import java.nio.channels.FileChannel;
import java.util.Iterator;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.FileUploadException;
import util.Archivos;
import util.FuncionServlets;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.*;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import util.Recurso;
import util.Utiles;
/**
 * @author Administrador
 * @version
 */
public class ArticuloAdmin extends HttpServlet {
    static final Logger logger = Utiles.iniciarLogger("ArticuloAdmin", true);
    /** Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    public void processRequest(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        armarPagina(request, response);
    }
    
    private void armarPagina(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        String artCodigo = "";
        String rutaFoto = "";
        String descripcion = "";
        String errorUpload = "";
        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        Recurso r = null;
        PrintWriter out = null;
        List items = null;
        /*UPLOAD*/
//        if ((request.getParameter("opcion") != null)&&(request.getParameter("opcion").equals("upload"))){
        logger.info("Intenta upload");
        r = new Recurso("negocio.properties");
        logger.info("Crea el recurso del properties");
        try {
            items = upload.parseRequest(request);
            logger.info("Crea el item");
        } catch (FileUploadException ex) {
            ex.printStackTrace();
            logger.info("Exception: "+ex.getMessage());
        }
        if (items != null){
            Iterator iter = items.iterator();
            logger.info("Crea el iterator para recorrer el item");
            while (iter.hasNext()) {
                FileItem item = (FileItem) iter.next();
                String fieldName = item.getFieldName();
                logger.info("Fieldname: "+fieldName);
                String fileName = item.getName();
                logger.info("Filename: "+fileName);
                String contentType = item.getContentType();
                if (item.isFormField()) {
                    if(fieldName.equals("descripcionFoto")){
                        descripcion = item.getString();
                    } else if(fieldName.equals("descripcionDocumento")){
                        descripcion = item.getString();
                    }
                    logger.info("El item es un campo del formulario, entonces guarda la descripcion");
                }else {
                    logger.info("El item NO es un campo del formulario, es un file");
                    boolean isInMemory = item.isInMemory();
                    long sizeInBytes = item.getSize();
                    if(sizeInBytes!=0){
                        File uploadedFile = null;
                        String codigo = "";
                        if (fieldName.equals("fileFoto")){
                            if (verificarExtension(item.getName())){
                                try {
                                    logger.info("Inserta la foto en la BD..");
                                    codigo = GestorArticulo.insertarFoto(request.getParameter("artCodigo"),descripcion);
                                    String nombreFoto = codigo + "." + obtenerExtension(item.getName());
                                    logger.info("Insercion de la foto en la BD, OK");
                                    logger.info("Crea el archivo "+nombreFoto+" para la foto en el dir: "+r.obtenerPropiedad("dirGuardaFotos"));
                                    uploadedFile = new File(r.obtenerPropiedad("dirGuardaFotos"),nombreFoto);
                                    logger.info("Creacion OK");
                                } catch (AvwException ex) {
                                    ex.printStackTrace();
                                    logger.info("Exception: "+ex.getMessage());
                                }
                            } else{
                                errorUpload = "El archivo que desea subir debe ser .jpg";
                                request.setAttribute("errorUpload",errorUpload);
                            }
                        }else if (fieldName.equals("fileDocumento")){
                            try {
                                logger.info("Inserta el doc en la BD..");
                                String d = GestorArticulo.insertarDocumento(request.getParameter("artCodigo"),descripcion)+"."+obtenerExtension(item.getName());
                                logger.info("Insercion del doc en la BD, OK");
                                logger.info("Crea el archivo "+d+" para el doc en el dir: "+r.obtenerPropiedad("dirGuardaDocumentos"));
                                uploadedFile = new File(r.obtenerPropiedad("dirGuardaDocumentos"),d);
                                logger.info("Creacion OK");
                            } catch (AvwException ex) {
                                ex.printStackTrace();
                            }
                        }
                        try {
                            item.write(uploadedFile);
                            /*Fotos que no se usan en la nueva version*/
                            /**/
                            String nombreFuente = uploadedFile.getParent()+"/"+uploadedFile.getName();
                            //String nombreDestinoMedia = uploadedFile.getParent()+"/"+codigo+"_media."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            //String nombreDestinoAlta = uploadedFile.getParent()+"/"+codigo+"_alta."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            //String nombreDestinoBaja = uploadedFile.getParent()+"/"+codigo+"_baja."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            //String nombreDestinoAmpliadaGrande = uploadedFile.getParent()+"/"+codigo+"_ampliadaGrande."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            /*Fotos actualmente utilizadas*/
                            //String nombreDestinoOriginal = uploadedFile.getParent()+"/"+codigo+"_original."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            //String desJmakiB = uploadedFile.getParent()+"/"+codigo+"_jmaki_b."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            String desFotoLista = uploadedFile.getParent()+"/"+codigo+"_lista."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            //String desFotoJmakiA = uploadedFile.getParent()+"/"+codigo+"_jmaki_a."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            String desFotoHome = uploadedFile.getParent()+"/"+codigo+"_home."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            String desFotoArticulo = uploadedFile.getParent()+"/"+codigo+"_articulo."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            String desFotoAmpliado = uploadedFile.getParent()+"/"+codigo+"_ampliado."+obtenerExtension(uploadedFile.getName()).toLowerCase();
                            /**/
                            if (fieldName.equals("fileFoto")){
                                try{
                                    FileInputStream fis = new FileInputStream(nombreFuente);
                                    FileOutputStream fos = new FileOutputStream(desFotoArticulo);
                                    FileChannel canalFuente = fis.getChannel();
                                    FileChannel canalDestino = fos.getChannel();
                                    canalFuente.transferTo(0, canalFuente.size(), canalDestino);
                                    fis.close();
                                    fos.close();
                                    File destino = new File(desFotoArticulo);
                                    /**
                                    String tamFotoGrande = r.obtenerPropiedad("tamFotoGrande");
                                    String tamFotoMedia = r.obtenerPropiedad("tamFotoMedia");
                                    String tamFotoChica = r.obtenerPropiedad("tamFotoChica");
                                    String tamFotoAmpliadaGrande = r.obtenerPropiedad("tamFotoAmpliadaGrande");
                                    /***/
                                    //String tamJMakiChica = r.obtenerPropiedad("tamJMakiChica");
                                    String tamLista = r.obtenerPropiedad("tamLista");
                                    //String tamJMakiGrande = r.obtenerPropiedad("tamJMakiGrande");
                                    String tamFotoHome = r.obtenerPropiedad("tamFotoHome");
                                    String tamArticulo = r.obtenerPropiedad("tamArticulo");
                                    String tamAmpliado = r.obtenerPropiedad("tamAmpliado");
                                    
                                    //util.Archivos.dimensionarImagen(destino,desJmakiB,tamJMakiChica, tamJMakiChica);
                                    util.Archivos.dimensionarImagen(destino,desFotoLista,tamLista, tamLista);
                                    //util.Archivos.dimensionarImagen(destino,desFotoJmakiA,tamJMakiGrande, tamJMakiGrande);
                                    util.Archivos.dimensionarImagen(destino,desFotoHome,tamFotoHome, tamFotoHome);
                                    util.Archivos.dimensionarImagen(destino,desFotoArticulo,tamArticulo, tamArticulo);
                                    util.Archivos.dimensionarImagen(destino,desFotoAmpliado,tamAmpliado, tamAmpliado);
                                    //util.Archivos.dimensionarImagen(destino,nombreDestinoAlta,tamFotoGrande, tamFotoGrande);
                                    //util.Archivos.dimensionarImagen(destino,nombreDestinoMedia,tamFotoMedia, tamFotoMedia);
                                    //util.Archivos.dimensionarImagen(destino,nombreDestinoBaja,tamFotoChica, tamFotoChica);
                                    //util.Archivos.dimensionarImagen(destino,nombreDestinoAmpliadaGrande,tamFotoAmpliadaGrande, tamFotoAmpliadaGrande);
                                    //util.Archivos.dimensionarImagen(destino,nombreDestinoOriginal,"", "");//Foto tamanio original
                                }catch (IOException ex) {}
                            }
                            logger.info("Se logro escribir el archivo");
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            logger.info("Exception: "+ex.getMessage());
                        }
                    }
                }
            }
        }
        logger.info("FIN UPLOAD");
//        }
        /*FIN Upload*/
        /*Elimina foto y documento*/
        if (request.getParameter("opcion") != null){
            logger.info("se quiere eliminar...");
            if ((request.getParameter("opcion").equals("eliminarFoto")) && (request.getParameter("fawCodigo")!=null)){
                try {
                    String path = r.obtenerPropiedad("dirGuardaFotos");
                    String nombreArchivo = obtenerNombreArchivo(request.getParameter("fawCodigo"),path);
                    File foto = new File(path+"/"+nombreArchivo);
                    if (foto.exists()){foto.delete();}
                    logger.info("Se elimina el archivo"+foto.getName());
                    nombreArchivo = obtenerNombreArchivo(request.getParameter("fawCodigo")+"_alta",path);
                    foto = new File(path+"/"+nombreArchivo);
                    if (foto.exists()){foto.delete();}
                    logger.info("Se elimina el archivo"+foto.getName());
                    nombreArchivo = obtenerNombreArchivo(request.getParameter("fawCodigo")+"_baja",path);
                    foto = new File(path+"/"+nombreArchivo);
                    if (foto.exists()){foto.delete();}
                        logger.info("Se elimina el archivo"+foto.getName());
                        nombreArchivo = obtenerNombreArchivo(request.getParameter("fawCodigo")+"_original",path);
                        foto = new File(path+"/"+nombreArchivo);
                    if (foto.exists()){foto.delete();}
                        logger.info("Se elimina el archivo"+foto.getName());
                        GestorArticulo.eliminarFoto(request.getParameter("fawCodigo"));
                } catch (AvwException ex) {
                    ex.printStackTrace();
                }
            }

            if ((request.getParameter("opcion").equals("eliminarDocumento")) && (request.getParameter("dawCodigo")!=null)){
                try {
                    String path = r.obtenerPropiedad("dirGuardaDocumentos");
                    String nombreArchivo = obtenerNombreArchivo(request.getParameter("dawCodigo"),path);
                    String ptoExtension = obtenerExtension(nombreArchivo);
                    File doc = new File(path+"/"+nombreArchivo+"."+ptoExtension,path);
                    doc.delete();
                    logger.info("Se elimina el archivo"+doc.getName());
                    GestorArticulo.eliminarDocumento(request.getParameter("dawCodigo"));
                    logger.info("Se elimina el archivo de la BD");
                } catch (AvwException ex) {
                    ex.printStackTrace();
                }
            }
        }
        /*Modifica el nivel de la foto*/
        if (request.getParameter("opcion") != null){
            if ((request.getParameter("opcion").equals("asignarPrimario"))
            && (request.getParameter("fawCodigo")!=null)
            && (request.getParameter("artCodigo")!=null)){
                try {
                    GestorArticulo.ModificarNivelFoto(request.getParameter("fawCodigo"),"1",request.getParameter("artCodigo"));
                } catch (AvwException ex) {
                    ex.printStackTrace();
                }
            }
        }
        /*Modifica Categoria*/
        if (request.getParameter("cawCodigo")!=null){
            GestorArticulo.guardarArticulo(request.getParameter("artCodigo"),null,
                    request.getParameter("cawCodigo"));
        }
        /*Modificar las palabras claves*/
        if (request.getParameter("palabrasClaves")!=null){
            GestorArticulo.guardarArticulo(request.getParameter("artCodigo"),
                    request.getParameter("palabrasClaves"),null);
        }
        request.setAttribute("1", "/vistas/administracion/encabezado.jsp");
        request.setAttribute("2", "/vistas/administracion/menu.jsp");
        if (request.getParameter("artCodigo") != null){
            request.setAttribute("3", "/vistas/administracion/articulo.jsp");
        }else if (request.getParameter("artCodigo") == null){
            request.setAttribute("3", "/vistas/administracion/listarArticulos.jsp");
        }
        request.setAttribute("4", "/vistas/administracion/pie.jsp");
        dispatch(request, response, "/compositor/administracion/trescuerpos.jsp");
    }
    
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    
    
    /** Handles the HTTP <code>GET</code> method.
     *
     *
     * @param request servlet request
     *
     *
     * @param response servlet response
     *
     *
     */
    
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    
    
    throws ServletException, IOException  {
        
        
        processRequest(request, response);
        
        
    }
    
    
    
    
    
    /** Handles the HTTP <code>POST</code> method.
     *
     *
     * @param request servlet request
     *
     *
     * @param response servlet response
     *
     *
     */
    
    
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    
    
    throws ServletException, IOException  {
        
        
        processRequest(request, response);
        
        
    }
    
    
    
    
    
    /** Returns a short description of the servlet.
     *
     *
     */
    
    
    public String getServletInfo() {
        
        
        return "Short description";
        
        
    }
    
    
// </editor-fold>
    /**
     * dispatcher method
     */
    protected void dispatch(HttpServletRequest request,
            HttpServletResponse response, String page)
            throws javax.servlet.ServletException,
            java.io.IOException {
        RequestDispatcher dispatcher =
                getServletContext().
                getRequestDispatcher(page);
        dispatcher.forward(request, response);
    }
    /**
     * Verifica la extension del nombre de archivo pasado por parametro
     * con respecto al filtro imagen existente en el properties negocio.
     **/
    private boolean verificarExtension(String nombreFile){
        logger.info("Verifica extension");
        Recurso r = null;
        String prop = "";
        String ext = obtenerExtension(nombreFile);
        try {
            r = new Recurso("negocio.properties");
            prop = r.obtenerPropiedad("filtroImagen");
        } catch (AvwException ex) {
            ex.printStackTrace();
        }
        String filtros[] = prop.split(",");
        for (int i=0; i<filtros.length; i++){
            if (ext.equals(filtros[i])){
                return true;
            }
        }
        return false;
    }
    /**
     * Obtiene la extension del nombre de archivo pasado por parametro.
     **/
    private String obtenerExtension(String nombreFile){
        String ext = "";
        nombreFile = nombreFile;
        StringTokenizer st = new StringTokenizer(nombreFile, ".");
        while(st.hasMoreTokens())
            ext = st.nextToken();
        return ext;
    }
    /**
     * Busca el archivo con el nombre y la ruta especificada.
     * Devuelve el nombre del archivo.
     **/
    private String obtenerNombreArchivo(String nombreBuscar, String path){
        File fichero = new File(path);
        String[] listaArchivos = fichero.list();
        String nombreArchivo = "";
        for(int i=0; i<listaArchivos.length; i++){
            File archivo = new File(path+"/"+listaArchivos[i]);
            if (archivo.getName().equals(nombreBuscar+"."+obtenerExtension(archivo.getName()))){
                nombreArchivo = listaArchivos[i];
            }
        }
        return nombreArchivo;
    }
}


